home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / puma.lha / puma / src / puma.pars < prev    next >
Text File  |  1992-09-25  |  17KB  |  464 lines

  1. PARSER
  2.  
  3. /* Ich, Doktor Josef Grosch, Informatiker, 28.9.1990 - 14.11.1991 */
  4.  
  5. GLOBAL {
  6.  
  7. FROM StringMem    IMPORT GetString, PutString;
  8. FROM Strings    IMPORT tString, SubString, Length, ArrayToString, IntToString, Concatenate;
  9. FROM Idents    IMPORT tIdent, NoIdent, MakeIdent;
  10. FROM Texts    IMPORT tText, MakeText;
  11. FROM Scanner    IMPORT BeginScanner, tScanAttribute, Attribute, Warning;
  12. FROM Positions    IMPORT tPosition, NoPosition;
  13.  
  14. FROM Tree    IMPORT
  15.    mSpec    , mCodes    , mAttrDesc    , mDesignator    ,
  16.    mLayoutAny    , mNoLayout    , mAnys        ,
  17.    mNoDesignator, mIdent    , mAny        , mNamedExpr    ,
  18.    mNoName    , mName        , mNoTreeName    , mTreeName    ,
  19.    mNoRoutine    , mPredicate    , mProcedure    , mFunction    ,
  20.    mType    , mNoParameter    , mParam    , mNoRule    ,
  21.    mRule    , mNoExpr    , mCompose    , mVarUse    ,
  22.    mTargetExpr    , mDontCare1    , mDontCare    , mOneExpr    ,
  23.    mNoStatement    , mTargetStmt    , mAssignment    , mCall        ,
  24.    mBinary    , mPreOperator    , mPostOperator    , mParents    ,
  25.    mProcCall    , mReject    , mFail        , mNl        ,
  26.    mStringExpr    , mNil        , mIndex    , Nil        ,
  27.    mOnePatternsList, mNoPatternsList    , OnePatternsList    ,
  28.    tTree    , Compose    , VarUse    , CopyTree    ,
  29.    TreeRoot    , MakeTree    , Codes        , ReverseTree    ;
  30.  
  31. VAR
  32.    String1, String2    : tString;
  33.    NameCount        : INTEGER;
  34.    Line            : tPosition;
  35.    nNoParameter, nNoName, nNoRule, nNoDesignator,
  36.    nNoStatement, nNoLayout, nNoPatternsList: tTree;
  37.  
  38. PROCEDURE mRules (Line: tPosition; Patterns, Exprs, Expr, Statements, Next: tTree): tTree;
  39.    VAR Tree    : tTree;
  40.    BEGIN
  41.       Tree := mRule (Line, Patterns^.OnePatternsList.Patterns, Exprs, Expr, Statements, Next);
  42.       Patterns := Patterns^.OnePatternsList.Next;
  43.       WHILE Patterns^.Kind = OnePatternsList DO
  44.      Tree := mRule (Line, Patterns^.OnePatternsList.Patterns, CopyTree (Exprs),
  45.             CopyTree (Expr), CopyTree (Statements), Tree);
  46.      Patterns := Patterns^.OnePatternsList.Next;
  47.       END;
  48.       RETURN Tree;
  49.    END mRules;
  50. }
  51.  
  52. BEGIN      {
  53.    BeginScanner;
  54.    NameCount := 0;
  55.    nNoParameter        := mNoParameter        ();
  56.    nNoName         := mNoName        ();
  57.    nNoRule         := mNoRule        ();
  58.    nNoDesignator    := mNoDesignator    ();
  59.    nNoStatement        := mNoStatement        ();
  60.    nNoLayout        := mNoLayout        ();
  61.    nNoPatternsList    := mNoPatternsList    ();
  62. }
  63.  
  64. PREC
  65.    NONE     '{'
  66.    NONE     HIGH
  67.  
  68. DECLARE
  69.    TreePart TreeNames PublicPart ExternPart0 ExternPart Names Codes Routines OutParameters
  70.    Parameters Declarations Type Rules Exprs NamedExprs Exprs2 NamedExprs2 Expr
  71.    Statements TargetCodes Space PrefixExpr PostfixExpr PrimaryExpr Patterns Patterns2
  72.                 = -> [Tree: tTree] .
  73.    LocalCode            = -> [Text: tText] .
  74.    TrafoName Name0 Name1    = -> [Id: tIdent] .
  75.    LocalCode Name0 Name1    = -> [Position: tPosition] .
  76.    Mode                = -> [IsRef: BOOLEAN] .
  77.  
  78. RULE
  79.  
  80. Trafo    = TrafoName TreePart PublicPart ExternPart0 Codes Routines
  81.       { => { TreeRoot := mSpec (TrafoName:Id, TreePart:Tree, PublicPart:Tree,
  82.          ExternPart0:Tree, Codes:Tree, ReverseTree (Routines:Tree)); }; } .
  83.  
  84. TrafoName    = <
  85.     = { Id := { ArrayToString ("Trafo", String1); Id := MakeIdent (String1); };  } .
  86.     = TRAFO Name0 .
  87. > .
  88. TreePart    = <
  89.     = { Tree := { ArrayToString ("Tree", String1);
  90.         Tree := mTreeName (MakeIdent (String1), Attribute.Position, mNoTreeName ()); }; } .
  91.     = 'TREE' TreeNames
  92.       { Tree := ReverseTree (TreeNames:Tree); } .
  93. > .
  94. TreeNames    = <
  95.     = { Tree := mNoTreeName (); } .
  96.     = TreeNames ',' .
  97.     = TreeNames Name0
  98.       { Tree := mTreeName (Name0:Id, Name0:Position, TreeNames:Tree); } .
  99. > .
  100. PublicPart    = <
  101.     = { Tree := nNoName; } .
  102.     = PUBLIC Names
  103.       { Tree := ReverseTree (Names:Tree); } .
  104. > .
  105. ExternPart0    = <
  106.     = { Tree := nNoName; } .
  107.     = EXTERN Names OptSemiColon
  108.       { Tree := ReverseTree (Names:Tree); } .
  109. > .
  110. ExternPart    = <
  111.     = { Tree := nNoName; } .
  112.     = EXTERN Names ';'
  113.       { Tree := ReverseTree (Names:Tree); } .
  114. > .
  115. Names    = <
  116.     = { Tree := nNoName; } .
  117.     = Names ',' .
  118.     = Names Name0
  119.       { Tree := mName (Name0:Id, Name0:Position, Names:Tree); } .
  120. > .
  121. Codes    = <
  122.     = { Tree := MakeTree (Codes); } .
  123.     = Codes 'EXPORT' TargetBlock
  124.       { Tree := { Tree := Codes:Tree;
  125.         Tree^.\Codes.Export     := TargetBlock:Text;
  126.         Tree^.\Codes.ExportLine := TargetBlock:Position; }; } .
  127.     = Codes 'IMPORT' TargetBlock
  128.       { Tree := { Tree := Codes:Tree;
  129.         Tree^.\Codes.Import     := TargetBlock:Text;
  130.         Tree^.\Codes.ImportLine := TargetBlock:Position; }; } .
  131.     = Codes 'GLOBAL' TargetBlock
  132.       { Tree := { Tree := Codes:Tree;
  133.         Tree^.\Codes.Global     := TargetBlock:Text;
  134.         Tree^.\Codes.GlobalLine := TargetBlock:Position; }; } .
  135.     = Codes 'BEGIN'  TargetBlock
  136.       { Tree := { Tree := Codes:Tree;
  137.         Tree^.\Codes.Begin      := TargetBlock:Text;
  138.         Tree^.\Codes.BeginLine  := TargetBlock:Position; }; } .
  139.     = Codes 'CLOSE'  TargetBlock
  140.       { Tree := { Tree := Codes:Tree;
  141.         Tree^.\Codes.Close      := TargetBlock:Text;
  142.         Tree^.\Codes.CloseLine  := TargetBlock:Position; }; } .
  143. > .
  144. Routines    = <
  145.     = { Tree := mNoRoutine (); } .
  146.  
  147.     = Routines PROCEDURE Name0 '(' Parameters OutParameters ')' ExternPart LocalCode Rules
  148.       { Tree := mProcedure (Routines:Tree, Name0:Id, Name0:Position,
  149.            Parameters:Tree, OutParameters:Tree, ExternPart:Tree, LocalCode:Text,
  150.            LocalCode:Position, ReverseTree (Rules:Tree)); } .
  151.  
  152.     = Routines 'FUNCTION' Name0 '(' Parameters OutParameters ')' Type ExternPart LocalCode Rules
  153.       { Tree := mFunction (Routines:Tree, Name0:Id, Name0:Position,
  154.            Parameters:Tree, OutParameters:Tree, ExternPart:Tree, LocalCode:Text,
  155.            LocalCode:Position, ReverseTree (Rules:Tree),
  156.            mParam (FALSE, NoIdent, NoPosition, Type:Tree, nNoParameter)); } .
  157.  
  158.     = Routines PREDICATE Name0 '(' Parameters OutParameters ')' ExternPart LocalCode Rules
  159.       { Tree := mPredicate (Routines:Tree, Name0:Id, Name0:Position,
  160.            Parameters:Tree, OutParameters:Tree, ExternPart:Tree, LocalCode:Text,
  161.            LocalCode:Position, ReverseTree (Rules:Tree)); } .
  162. > .
  163. OutParameters    = <
  164.     = { Tree := nNoParameter; } .
  165.     = '=>' Parameters .
  166. > .
  167. Parameters    = <
  168.     = { Tree := nNoParameter; } PREC HIGH .
  169.     = Mode Ident ':' Type
  170.       { Tree := mParam (Mode:IsRef, Ident:Ident, Ident:Position, Type:Tree, nNoParameter); } .
  171.     = Mode Type
  172.       { Tree := { ArrayToString ("yyP", String1); INC (NameCount);
  173.            IntToString (NameCount, String2); Concatenate (String1, String2);
  174.            Tree := mParam (Mode:IsRef, MakeIdent (String1), NoPosition, Type:Tree, nNoParameter); }; } .
  175.     = Mode Ident ':' Type ',' Parameters
  176.       { Tree := mParam (Mode:IsRef, Ident:Ident, Ident:Position, Type:Tree, Parameters:Tree); } .
  177.     = Mode Type ',' Parameters
  178.       { Tree := { ArrayToString ("yyP", String1); INC (NameCount);
  179.            IntToString (NameCount, String2); Concatenate (String1, String2);
  180.            Tree := mParam (Mode:IsRef, MakeIdent (String1), NoPosition, Type:Tree, Parameters:Tree); }; } .
  181. > .
  182. Mode    = <
  183.     =     { IsRef := FALSE; } .
  184.     = REF { IsRef := TRUE ; } .
  185. > .
  186. Declarations    = <
  187.     = Ident ':' Type
  188.       { Tree := mParam (FALSE, Ident:Ident, Ident:Position, Type:Tree, nNoParameter); } .
  189.     = Ident ':' Type ',' Declarations
  190.       { Tree := mParam (FALSE, Ident:Ident, Ident:Position, Type:Tree, Declarations:Tree); } .
  191. > .
  192. Type    = <
  193.     = Ident
  194.       { Tree := mType (Ident:Ident, Ident:Position, nNoName); } .
  195.     = Ident '.' Type: Name0
  196.       { Tree := mType (Ident:Ident, Ident:Position, mName (Type:Id, Type:Position, nNoName)); } .
  197.     =           '[' Names ']'
  198.       { Tree := mType (NoIdent, '[':Position, ReverseTree (Names:Tree)); } .
  199. /*    = Ident     '[' Names ']'
  200.       { Tree := mType (Ident:Ident, Ident:Position, ReverseTree (Names:Tree)); } . */
  201.     = Ident '.' '[' Names ']'
  202.       { Tree := mType (Ident:Ident, Ident:Position, ReverseTree (Names:Tree)); } .
  203. > .
  204. LocalCode    = <
  205.     = { Text := { MakeText (Text); }; Position := NoPosition; } .
  206.     = 'LOCAL' TargetBlock .
  207. > .
  208. Rules    = <
  209.     = { Tree := nNoRule; } .
  210.  
  211.     = Rules SetLine Patterns2 '.'
  212.       { Tree := mRules (Line, Patterns2:Tree, mNoExpr ('.':Position),
  213.            mNoExpr ('.':Position), nNoStatement, Rules:Tree); } .
  214.  
  215.     = Rules SetLine Patterns '?' Statements '.'
  216.       { Tree := mRules (Line, Patterns:Tree, mNoExpr ('.':Position),
  217.            mNoExpr ('.':Position), ReverseTree (Statements:Tree), Rules:Tree); } .
  218.  
  219.     = Rules SetLine Patterns '=>' Exprs2 '.'
  220.       { Tree := mRules (Line, Patterns:Tree, Exprs2:Tree, mNoExpr ('.':Position),
  221.            nNoStatement, Rules:Tree); } .
  222.  
  223.     = Rules SetLine Patterns RETURN Expr ';' '.'
  224.       { Tree := mRules (Line, Patterns:Tree, mNoExpr ('.':Position), Expr:Tree,
  225.            nNoStatement, Rules:Tree); } .
  226.  
  227.     = Rules SetLine Patterns '=>' Exprs '?' Statements '.'
  228.       { Tree := mRules (Line, Patterns:Tree, Exprs:Tree, mNoExpr ('.':Position),
  229.            ReverseTree (Statements:Tree), Rules:Tree); } .
  230.  
  231.     = Rules SetLine Patterns '?' Statements '=>' Exprs2 '.'
  232.       { Tree := mRules (Line, Patterns:Tree, Exprs2:Tree, mNoExpr ('.':Position),
  233.            ReverseTree (Statements:Tree), Rules:Tree); } .
  234.  
  235.     = Rules SetLine Patterns '=>' Exprs RETURN Expr ';' '.'
  236.       { Tree := mRules (Line, Patterns:Tree, Exprs:Tree, Expr:Tree,
  237.            nNoStatement, Rules:Tree); } .
  238.  
  239.     = Rules SetLine Patterns RETURN Expr OptSemiColon '?' Statements '.'
  240.       { Tree := mRules (Line, Patterns:Tree, mNoExpr ('.':Position), Expr:Tree,
  241.            ReverseTree (Statements:Tree), Rules:Tree); } .
  242.  
  243.     = Rules SetLine Patterns '?' Statements RETURN Expr ';' '.'
  244.       { Tree := mRules (Line, Patterns:Tree, mNoExpr ('.':Position), Expr:Tree,
  245.            ReverseTree (Statements:Tree), Rules:Tree); } .
  246.  
  247.     = Rules SetLine Patterns '=>' Exprs RETURN Expr OptSemiColon '?' Statements '.'
  248.       { Tree := mRules (Line, Patterns:Tree, Exprs:Tree, Expr:Tree,
  249.            ReverseTree (Statements:Tree), Rules:Tree); } .
  250.  
  251.     = Rules SetLine Patterns '=>' Exprs '?' Statements RETURN Expr ';' '.'
  252.       { Tree := mRules (Line, Patterns:Tree, Exprs:Tree, Expr:Tree,
  253.            ReverseTree (Statements:Tree), Rules:Tree); } .
  254.  
  255.     = Rules SetLine Patterns '?' Statements '=>' Exprs RETURN Expr ';' '.'
  256.       { Tree := mRules (Line, Patterns:Tree, Exprs:Tree, Expr:Tree,
  257.            ReverseTree (Statements:Tree), Rules:Tree); } .
  258. > .
  259. SetLine    = { => { Line := Attribute.Position; }; } .
  260.  
  261. OptSemiColon    = <
  262.     = .
  263.     = ';' .
  264. > .
  265. Patterns    = <
  266.     = Exprs
  267.       { Tree := mOnePatternsList (Exprs:Tree, nNoPatternsList); } .
  268.     = Exprs ';' Patterns
  269.       { Tree := mOnePatternsList (Exprs:Tree, Patterns:Tree); } .
  270. > .
  271. Patterns2    = <
  272.     = Exprs ';'
  273.       { Tree := mOnePatternsList (Exprs:Tree, nNoPatternsList); } .
  274.     = Exprs ';' Patterns2
  275.       { Tree := mOnePatternsList (Exprs:Tree, Patterns2:Tree); } .
  276. > .
  277. Exprs    = <
  278.     = '..'
  279.       { Tree := mOneExpr (mDontCare ('..':Position), mNoExpr (Attribute.Position)); } .
  280.     = '..' ','
  281.       { Tree := mOneExpr (mDontCare ('..':Position), mNoExpr (Attribute.Position)); } .
  282.     = Expr
  283.       { Tree := mOneExpr (Expr:Tree, mNoExpr (Attribute.Position)); } .
  284.     = Expr ',' Exprs
  285.       { Tree := mOneExpr (Expr:Tree, Exprs:Tree); } .
  286.     = NamedExprs .
  287. > .
  288. NamedExprs    = <
  289.     = { Tree := mNoExpr (Attribute.Position); } .
  290.     = Ident ':=' Expr
  291.       { Tree := mNamedExpr (Expr:Tree, mNoExpr (Attribute.Position), Ident:Ident); } .
  292.     = Ident ':=' Expr ',' NamedExprs
  293.       { Tree := mNamedExpr (Expr:Tree, NamedExprs:Tree, Ident:Ident); } .
  294. > .
  295. Exprs2    = <
  296.     = '..'
  297.       { Tree := mOneExpr (mDontCare ('..':Position), mNoExpr (Attribute.Position)); } .
  298.     = '..' ','
  299.       { Tree := mOneExpr (mDontCare ('..':Position), mNoExpr (Attribute.Position)); } .
  300.     = Expr ',' Exprs2
  301.       { Tree := mOneExpr (Expr:Tree, Exprs2:Tree); } .
  302.     = NamedExprs2 .
  303. > .
  304. NamedExprs2    = <
  305.     = { Tree := mNoExpr (Attribute.Position); } .
  306.     = Ident ':=' Expr ',' NamedExprs2
  307.       { Tree := mNamedExpr (Expr:Tree, NamedExprs2:Tree, Ident:Ident); } .
  308. > .
  309. Expr    = <
  310.     = PrefixExpr .
  311.     = Expr Operator PrefixExpr
  312.       { Tree := mBinary (Operator:Position, Expr:Tree, Operator:Ident, PrefixExpr:Tree); } .
  313. > .
  314. PrefixExpr    = <
  315.     = PostfixExpr .
  316.     = Ident ':' PostfixExpr
  317.       { Tree := {
  318.         Tree := PostfixExpr:Tree;
  319.         IF Tree^.Kind = Compose THEN
  320.            Tree^.Compose.Selector := Ident:Ident;
  321.         ELSIF Tree^.Kind = Nil THEN
  322.            Tree^.Nil.Selector := Ident:Ident;
  323.         ELSIF Tree^.Kind = VarUse THEN
  324.            Tree := mCompose (Tree^.VarUse.Pos, Ident:Ident, Tree,
  325.                mOneExpr (mDontCare (Tree^.VarUse.Pos),
  326.                mNoExpr (Tree^.VarUse.Pos)), FALSE);
  327.         ELSE
  328.            Warning ("label ignored", Ident:Position);
  329.         END; }; } .
  330.     = Ident ':>' PostfixExpr
  331.       { Tree := {
  332.         Tree := PostfixExpr:Tree;
  333.         IF Tree^.Kind = Compose THEN
  334.            Tree^.Compose.Selector := Ident:Ident;
  335.            Tree^.Compose.Widen := TRUE;
  336.         ELSIF Tree^.Kind = Nil THEN
  337.            Tree^.Nil.Selector := Ident:Ident;
  338.         ELSIF Tree^.Kind = VarUse THEN
  339.            Tree := mCompose (Tree^.VarUse.Pos, Ident:Ident, Tree,
  340.                mOneExpr (mDontCare (Tree^.VarUse.Pos),
  341.                mNoExpr (Tree^.VarUse.Pos)), TRUE);
  342.         ELSE
  343.            Warning ("label ignored", Ident:Position);
  344.         END; }; } .
  345.     = Operator PrefixExpr
  346.       { Tree := mPreOperator (Operator:Position, Operator:Ident, PrefixExpr:Tree); } .
  347.     = IncOperator PrefixExpr
  348.       { Tree := mPreOperator (IncOperator:Position, IncOperator:Ident, PrefixExpr:Tree); } .
  349. > .
  350. PostfixExpr    = <
  351.     = PrimaryExpr .
  352.     = PostfixExpr '[' Exprs ']'
  353.       { Tree := mIndex ('[':Position, PostfixExpr:Tree, Exprs:Tree); } .
  354.     = PostfixExpr '(' Exprs ')'
  355.       { Tree := mCompose ('(':Position, NoIdent, PostfixExpr:Tree, Exprs:Tree, FALSE); } .
  356.     = PostfixExpr '(' Exprs '=>' OutExprs: Exprs ')'
  357.       { Tree := mCall ('(':Position, PostfixExpr:Tree, Exprs:Tree, OutExprs:Tree); } .
  358.     = PostfixExpr '.' Ident
  359.       { Tree := { ArrayToString (".", String1);
  360.         Tree := mBinary ('.':Position, PostfixExpr:Tree, MakeIdent (String1),
  361.               mVarUse (Ident:Position, Ident:Ident)); }; } .
  362.     = PostfixExpr '->' Ident
  363.       { Tree := { ArrayToString ("->", String1);
  364.         Tree := mBinary ('->':Position, PostfixExpr:Tree, MakeIdent (String1),
  365.               mVarUse (Ident:Position, Ident:Ident)); }; } .
  366.     = PostfixExpr '^'
  367.       { Tree := { ArrayToString ("^", String1);
  368.         Tree := mPostOperator ('^':Position, MakeIdent (String1), PostfixExpr:Tree); }; } .
  369.     = PostfixExpr IncOperator
  370.       { Tree := mPostOperator (IncOperator:Position, IncOperator:Ident, PostfixExpr:Tree); } .
  371. > .
  372. PrimaryExpr    = <
  373.     = Ident
  374.       { Tree := mVarUse (Ident:Position, Ident:Ident); } .
  375.     = NIL
  376.       { Tree := mNil (NIL:Position, NoIdent); } .
  377.     = '_'
  378.       { Tree := mDontCare1 ('_':Position); } .
  379.     = Number
  380.       { Tree := mTargetExpr (Number:Position, mAny (Number:StringRef, nNoDesignator)); } .
  381.     = String
  382.       { Tree := mStringExpr (String:Position, String:StringRef); } .
  383.     = Label: Ident '::' Ident
  384.       { Tree := mAttrDesc (Ident:Position, Label:Ident, Ident:Ident); } .
  385.     = '{' TargetCodes '}'
  386.       { Tree := mTargetExpr ('{':Position, ReverseTree (TargetCodes:Tree)); } PREC '{' .
  387.     = '(' Expr ')'
  388.       { Tree := mParents ('(':Position, Expr:Tree); } .
  389. > .
  390. Statements    = <
  391.     = { Tree := nNoStatement; } .
  392.     = Statements Expr ';'
  393.       { Tree := mProcCall (Expr:Tree^.\Expr.Pos, Statements:Tree, Expr:Tree); } .
  394.     = Statements Adr:Expr ':=' Expr ';'
  395.       { Tree := mAssignment (':=':Position, Statements:Tree, Adr:Tree, Expr:Tree); } .
  396.     = Statements REJECT
  397.       { Tree := mReject (REJECT:Position, Statements:Tree); } .
  398.     = Statements FAIL
  399.       { Tree := mFail (FAIL:Position, Statements:Tree); } .
  400.     = Statements Declarations ';'
  401.       { Tree := mTargetStmt (';':Position, Statements:Tree, Declarations:Tree, nNoDesignator); } .
  402.     = Statements '{' TargetCodes '}' ';'
  403.       { Tree := mTargetStmt ('{':Position, Statements:Tree, nNoParameter, ReverseTree (TargetCodes:Tree)); } .
  404.     = Statements NL
  405.       { Tree := mNl (NL:Position, Statements:Tree); } .
  406.     = Statements ';' .
  407. > .
  408. TargetCodes    = <
  409.     = { Tree := nNoDesignator; } .
  410.     = TargetCodes Name1 Space '::' Space Ident
  411.       { Tree := mDesignator (Name1:Id, Ident:Ident, Name1:Position, TargetCodes:Tree); } .
  412.     = TargetCodes Name1 Space '::' Space2:Space
  413.       { Tree := {
  414.         Tree := mIdent (Name1:Id, Name1:Position, TargetCodes:Tree);
  415.         Tree := mAnys (ReverseTree (Space:Tree), Tree);
  416.         Tree := mAny ('::':StringRef, Tree);
  417.         Tree := mAnys (ReverseTree (Space2:Tree), Tree); }; } .
  418.     = TargetCodes Name1 Space
  419.       { Tree := {
  420.         Tree := mIdent (Name1:Id, Name1:Position, TargetCodes:Tree);
  421.         Tree := mAnys (ReverseTree (Space:Tree), Tree); }; } .
  422.     = TargetCodes '::'
  423.       { Tree := mAny ('::':StringRef, TargetCodes:Tree); } .
  424.     = TargetCodes TargetCode
  425.       { Tree := mAny (TargetCode:StringRef, TargetCodes:Tree); } .
  426.     = TargetCodes WhiteSpace
  427.       { Tree := mAny (WhiteSpace:StringRef, TargetCodes:Tree); } .
  428. > .
  429. Name0    = <
  430.     = Ident
  431.       { Id        := Ident:Ident;
  432.         Position    := Ident:Position; } .
  433.     = String
  434.       { Id        := { GetString (String:StringRef, String1);
  435.                  SubString (String1, 2, Length (String1) - 1, String2);
  436.                  Id := MakeIdent (String2); };
  437.         Position    := String:Position; } .
  438. > .
  439. Name1    = <
  440.     = Ident
  441.       { Id    := Ident:Ident;
  442.         Position    := Ident:Position; } .
  443.     = String
  444.       { Id    := { GetString (String:StringRef, String1); Id := MakeIdent (String1); };
  445.         Position    := String:Position; } .
  446. > .
  447. Space    = <
  448.     = { Tree := nNoLayout; } .
  449.     = Space WhiteSpace
  450.       { Tree := mLayoutAny (WhiteSpace:StringRef, Space:Tree); } .
  451. > .
  452.  
  453. Ident        : [Ident    : tIdent    ] { Ident    := NoIdent    ; } <
  454.    Operator    : .
  455.    IncOperator    : .
  456. > .
  457. TargetBlock    : [Text        : tText        ] { Text    := { MakeText (Text); }; } .
  458. String        : [StringRef    : tStringRef    ] { StringRef    := GetStringRef (NoIdent); } <
  459.    Number    : .
  460.    TargetCode    : .
  461.    WhiteSpace    : .
  462.    '::'        : .
  463. > .
  464.